package com.aasa.siccosap.dao;

import java.sql.CallableStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

import javax.sql.DataSource;

import org.apache.log4j.Logger;

import com.aasa.siccosap.bean.CuentaCorriente;
import com.aasa.siccosap.bean.NotaCredito;
import com.aasa.siccosap.bean.ObraNotaCredito;
import com.aasa.siccosap.bean.ParametrosConsultaObra;
import com.aasa.siccosap.bean.ParametrosGenerales;
import com.aasa.siccosap.bean.ParametrosConsultaCuentaCorriente;
import com.aasa.siccosap.util.Constantes;

import oracle.jdbc.OracleTypes;

	/**
	 * Data access object (DAO) for domain model class RegistroCuentaCorriente.
	 * 	 
	 */

public class CuentaCorrienteDAO extends ConsultaClienteBaseDAO {
    
	static Logger logger = Logger.getLogger("CuentaCorrienteDAO.class");
	public CuentaCorrienteDAO()	throws accesoDaoException {
		super();
	}
	
	public CuentaCorrienteDAO(DataSource dataSource) {
		super(dataSource);
	}
	
	public List<CuentaCorriente> consultarDeudasVencidas(ParametrosGenerales parametros) throws Exception{
        ResultSet rs = null;
        this.av_message = null;
        this.storedProcedure = "begin SICCOSPK_PROYECTO.SICCOSSP_CONSULTA_DEUDAS_VENC(?,?,?,?); end;";
        List<CuentaCorriente> consultaCuentaCorriente=new ArrayList<CuentaCorriente>();
        try{
                this.conn = dataSource.getConnection();
                this.stmt = this.conn.prepareCall(storedProcedure);
                              
                configuraParametrosConsultaDeudasVencidas(parametros);
                
                this.stmt.execute();

                //Se obtiene la respuesta error/exito del stored
                this.av_message = (String)stmt.getObject(1);
                	
                    if(this.av_message.trim().toUpperCase().endsWith(Constantes.NO_ERRORS)){
                        //Se obtiene el objeto del cursor
                        rs = (ResultSet)stmt.getObject(2);
                        while(rs.next()){
                                CuentaCorriente registroCtaCte = creaRegistroConsultaDeudasVencidas(rs);
                                consultaCuentaCorriente.add(registroCtaCte);
                        }
                }else{
                    return null;
                }

                
        }catch (Exception e){
                e.printStackTrace();
                return null;
        }finally{
        		close(this.conn, rs, stmt);
        }
        return(consultaCuentaCorriente);
        
    }
    	
	
    public List<CuentaCorriente> consultarCuentaCorrienteCanceladosAplicacion(ParametrosConsultaCuentaCorriente parametros) throws Exception{
        ResultSet objL_rs = null;
        this.av_message = null;
        this.storedProcedure = "begin SICCOSPK_PROYECTO.SICCOSSP_CONSULTA_CTA_CTE_CAAP(?,?,?,?,?,?); end;";
        List<CuentaCorriente> aobjL_consultaCuentaCorriente=new ArrayList<CuentaCorriente>();
        try{
                this.conn = dataSource.getConnection();
                this.stmt = this.conn.prepareCall(storedProcedure);
                              
                configuraParametrosConsultaCuentasCorrientes(parametros);
                
                this.stmt.execute();

                //Se obtiene la respuesta error/exito del stored
                this.av_message = (String)stmt.getObject(1);
                	
                    if(this.av_message.trim().toUpperCase().endsWith(Constantes.NO_ERRORS)){
                        //Se obtiene el objeto del cursor
                    	objL_rs = (ResultSet)stmt.getObject(2);
                        while(objL_rs.next()){
                                CuentaCorriente registroCtaCte = creaRegistroConsultaCuentaCorriente(objL_rs);
                                aobjL_consultaCuentaCorriente.add(registroCtaCte);
                        }
                }else{
                    return null;
                }

                
        }catch (Exception e){
                e.printStackTrace();
                return null;
        }finally{
        		close(this.conn, objL_rs, stmt);
        }
        return(aobjL_consultaCuentaCorriente);
        
    }
    
    public List<CuentaCorriente> consultarDocumentosNoCanceladosConAplicacion(ParametrosConsultaCuentaCorriente parametros) throws Exception{
        ResultSet rs = null;
        this.av_message = null;
        this.storedProcedure = "begin SICCOSPK_PROYECTO.SICCOSSP_DOCU_CLIENTE_NCAAP(?,?,?,?,?,?); end;";
        List<CuentaCorriente> consultaCuentaCorriente=new ArrayList<CuentaCorriente>();
        try{
                this.conn = dataSource.getConnection();
                this.stmt = this.conn.prepareCall(storedProcedure);
                              
                configuraParametrosConsultaCuentasCorrientes(parametros);
                
                this.stmt.execute();

                //Se obtiene la respuesta error/exito del stored
                this.av_message = (String)stmt.getObject(1);
                	
                    if(this.av_message.trim().toUpperCase().endsWith(Constantes.NO_ERRORS)){
                        //Se obtiene el objeto del cursor
                        rs = (ResultSet)stmt.getObject(2);
                        while(rs.next()){
                                CuentaCorriente registroCtaCte = creaRegistroConsultaCuentaCorriente(rs);
                                consultaCuentaCorriente.add(registroCtaCte);
                        }
                }else{
                    return null;
                }

                
        }catch (Exception e){
                e.printStackTrace();
                return null;
        }finally{
        		close(this.conn, rs, stmt);
        }
        return(consultaCuentaCorriente);
        
    }

    
    private CallableStatement configuraParametrosConsultaCuentasCorrientes(ParametrosConsultaCuentaCorriente parametros)
    throws SQLException{
            	
    	stmt.registerOutParameter(1, OracleTypes.VARCHAR);               
        stmt.registerOutParameter(2, OracleTypes.CURSOR);
    	
        stmt.setString(3, parametros.getStrPb_codigoCliente());
        stmt.setString(4, parametros.getStrPb_estado());

        java.sql.Date fechaInicioSQL = new java.sql.Date(parametros.getObjPb_fechaInicio().getTime());
        java.sql.Date fechaFinSQL = new java.sql.Date(parametros.getObjPb_fechaFin().getTime());
        stmt.setDate(5,fechaInicioSQL);	       
        stmt.setDate(6,fechaFinSQL);
       
        return(stmt);          
        
    }
    
    private CuentaCorriente creaRegistroConsultaCuentaCorriente(ResultSet rs) throws SQLException {
        
        CuentaCorriente bean = new CuentaCorriente();
        
        bean.setStrPb_tipoDocumento(rs.getString("TIPO"));
        
        bean.setStrPb_serie(rs.getString("SERIE_MANUAL"));
        bean.setStrPb_numero(rs.getString("NUMERO_MANUAL"));
        bean.setObjPb_fechaEmision(rs.getDate("FEC_EMI"));
        bean.setObjPb_fechaVencimiento(rs.getDate("FEC_VEN"));
        bean.setObjPb_fechaCancelacion(rs.getDate("FEC_CAN"));
        bean.setDblPb_importeSoles(rs.getDouble("IMPORTE_SOLES"));
        bean.setDblPb_importeDolares(rs.getDouble("IMPORTE_DOLARES"));
        bean.setDblPb_tipoCambio(rs.getDouble("TIP_CAM"));
        bean.setDblPb_importeDocumentoPercepcion(rs.getDouble("DP_SOLES"));
                        
        return (bean);

    }
     
    private CallableStatement configuraParametrosConsultaDeudasVencidas(ParametrosGenerales parametros)
    throws SQLException{            	
    	stmt.registerOutParameter(1, OracleTypes.VARCHAR);               
        stmt.registerOutParameter(2, OracleTypes.CURSOR);
    	
        stmt.setString(3, parametros.getStrPb_codigoCliente());                        
        java.sql.Date fechaFinSQL = new java.sql.Date(parametros.getObjPb_fechaFin().getTime());
        stmt.setDate(4,fechaFinSQL);

        
        return(stmt);                  
    }    
    
    private CuentaCorriente creaRegistroConsultaDeudasVencidas(ResultSet rs) throws SQLException {
        
        CuentaCorriente bean = new CuentaCorriente();
        
        bean.setStrPb_tipoDocumento(rs.getString("TIPO_DOC"));
        bean.setStrPb_serie(rs.getString("SERIE"));
        bean.setStrPb_numero(rs.getString("NUMERO"));
        bean.setObjPb_fechaEmision(rs.getDate("FEC_EMI"));
        bean.setObjPb_fechaVencimiento(rs.getDate("FEC_VEN"));        
        bean.setDblPb_deudaSoles(rs.getDouble("DEUDA_SOLES"));
        bean.setDblPb_deudaDolares(rs.getDouble("DEUDA_DOLARES"));
                        
        return (bean);
    }

	public List<CuentaCorriente> consultarCuentaCorrienteObra(
			ParametrosConsultaObra parametros) throws Exception{
		
	
		ResultSet objL_rs = null;
        this.av_message = null;
        this.storedProcedure = "begin SICCOSPK_PROYECTO.SICCOSSP_DOCUMENTOS_CLIENTE(?,?,?,?,?,?); end;";
        List<CuentaCorriente> aobjL_consultaCuentaCorriente=new ArrayList<CuentaCorriente>();
        try{
                this.conn = dataSource.getConnection();
                this.stmt = this.conn.prepareCall(storedProcedure);
                              
                configuraParametrosConsultaDocumentosObra(parametros);
                
                this.stmt.execute();

                this.av_message = (String)stmt.getObject(1);
                	
                    if(this.av_message.trim().toUpperCase().endsWith(Constantes.NO_ERRORS)){
                        
                    	objL_rs = (ResultSet)stmt.getObject(2);
         
                    	while(objL_rs.next()){
                                CuentaCorriente objL_registroCtaCte = new CuentaCorriente();
                                objL_registroCtaCte.setStrPb_serie(objL_rs.getString("SER_DOC"));
                                objL_registroCtaCte.setStrPb_numero(objL_rs.getString("NUM_DOC"));
                                objL_registroCtaCte.setStrPb_tipoDocumento(objL_rs.getString("TIP"));
                                objL_registroCtaCte.setStrPb_empresa(objL_rs.getString("EMP"));
                                objL_registroCtaCte.setStrPb_distribuidora(objL_rs.getString("DIS"));
                                
                        
                                aobjL_consultaCuentaCorriente.add(objL_registroCtaCte);
                        }
                }else{
                    return null;
                }

                
        }catch (Exception e){
                e.printStackTrace();
                return null;
        }finally{
        		close(this.conn, objL_rs, stmt);
        }
        
		
        
        return(aobjL_consultaCuentaCorriente);
		
		
		
	}

	private CallableStatement configuraParametrosConsultaDocumentosObra(
			ParametrosConsultaObra parametros) 
		
		 throws SQLException{
         	
		    	stmt.registerOutParameter(1, OracleTypes.VARCHAR);               
		        stmt.registerOutParameter(2, OracleTypes.CURSOR);
		    	
		        stmt.setString(3, parametros.getStrPb_codigoCliente());
		        stmt.setString(4, parametros.getStrPb_numeroObra());

		        java.sql.Date fechaInicioSQL = new java.sql.Date(parametros.getObjPb_fechaInicio().getTime());
		        java.sql.Date fechaFinSQL = new java.sql.Date(parametros.getObjPb_fechaFin().getTime());
		        stmt.setDate(5,fechaInicioSQL);	       
		        stmt.setDate(6,fechaFinSQL);
		       
		        return(stmt);        
		
	}

	public CuentaCorriente solicitarDocumentoObraSelecta(
			CuentaCorriente objA_cuentaCorriente) throws Exception{
		
		ResultSet objL_rs = null;
        this.av_message = null;
        this.storedProcedure = "begin SICCOSPK_PROYECTO.P_OBTEN_DOCUMENTO(?,?,?,?,?,?,?); end;";
        CuentaCorriente objL_cuentaCorriente = new CuentaCorriente();
        try{
                this.conn = dataSource.getConnection();
                this.stmt = this.conn.prepareCall(storedProcedure);
                              
                configuraParametrosDocObraSelecta(objA_cuentaCorriente);
                
                this.stmt.execute();

                this.av_message = (String)stmt.getObject(1);
                	
                    if(this.av_message.trim().toUpperCase().endsWith(Constantes.NO_ERRORS)){

                    	objL_rs = (ResultSet)stmt.getObject(2);
                      if(objL_rs.next()){                              
                    	
                          
                    	  objL_cuentaCorriente.setStrPb_tipoDocumento(objL_rs.getString("DES_ABV"));
                          
                    	  objL_cuentaCorriente.setStrPb_serie(objL_rs.getString("SERIE_MANUAL"));
                    	  objL_cuentaCorriente.setStrPb_numero(objL_rs.getString("NUMERO_MANUAL"));
                    	  objL_cuentaCorriente.setObjPb_fechaEmision(objL_rs.getDate("FEC_EMI"));
                    	  objL_cuentaCorriente.setObjPb_fechaVencimiento(objL_rs.getDate("FEC_VEN"));
                    	  objL_cuentaCorriente.setObjPb_fechaCancelacion(objL_rs.getDate("FEC_CAN"));
                    	  objL_cuentaCorriente.setDblPb_importeSoles(objL_rs.getDouble("IMPORTE_SOLES"));
                    	  objL_cuentaCorriente.setDblPb_importeDolares(objL_rs.getDouble("IMPORTE_DOLARES"));
                          objL_cuentaCorriente.setDblPb_tipoCambio(objL_rs.getDouble("TIP_CAM"));
                          objL_cuentaCorriente.setDblPb_importeDocumentoPercepcion(objL_rs.getDouble("CF_DP"));
                          objL_cuentaCorriente.setStrPb_guiaRm(objL_rs.getString("GUIA_REMISION"));
                          objL_cuentaCorriente.setStrPb_guiaTrans(objL_rs.getString("GUIA_TRANSBORDO"));
                                
                                
                        }
                }else{
                    return null;
                }

                
        }catch (Exception e){
                e.printStackTrace();
                return null;
        }finally{
        		close(this.conn, objL_rs, stmt);
        }
        return( objL_cuentaCorriente);
		
		
		
	}

	private CallableStatement configuraParametrosDocObraSelecta(
			CuentaCorriente cuentaCorriente) throws SQLException{
     	
    	stmt.registerOutParameter(1, OracleTypes.VARCHAR);               
        stmt.registerOutParameter(2, OracleTypes.CURSOR);
    	
        stmt.setString(3, cuentaCorriente.getStrPb_empresa());
        stmt.setString(4, cuentaCorriente.getStrPb_distribuidora());

        
        stmt.setString(5,cuentaCorriente.getStrPb_tipoDocumento());	       
        stmt.setString(6,cuentaCorriente.getStrPb_serie());
        stmt.setString(7,cuentaCorriente.getStrPb_numero());
        
       
        return(stmt);        
		
	}

	public ObraNotaCredito solicitarNotaCreditoObra(ObraNotaCredito notaCredito) {
		
		ResultSet objL_rs = null;
        this.av_message = null;
        this.storedProcedure = "begin SICCOSPK_PROYECTO.SICCOSSP_OBTEN_NOTACREDITO(?,?,?,?,?,?,?); end;";
        ObraNotaCredito objL_obraNotaCredito = new ObraNotaCredito();
        try{
                this.conn = dataSource.getConnection();
                this.stmt = this.conn.prepareCall(storedProcedure);
                              
                configuraParametrosNotaCreditocuenta(notaCredito);
                
                this.stmt.execute();

                this.av_message = (String)stmt.getObject(1);
                	
                    if(this.av_message.trim().toUpperCase().endsWith(Constantes.NO_ERRORS)){
    
                    	objL_rs = (ResultSet)stmt.getObject(2);
                      if(objL_rs.next()){                              
                    	
                    	  objL_obraNotaCredito.setStrPb_tipoDoc(objL_rs.getString("DESC_TIP_DOC"));
                    	  objL_obraNotaCredito.setStrPb_serieManual(objL_rs.getString("SERIE_MANUAL"));
                    	  objL_obraNotaCredito.setStrPb_numeroManual(objL_rs.getString("NUMERO_MANUAL"));
                    	  objL_obraNotaCredito.setObjPb_fechaEmision(objL_rs.getDate("FEC_EMI"));
                    	  objL_obraNotaCredito.setDblPb_toneladas(objL_rs.getDouble("TONELADAS"));
                    	  objL_obraNotaCredito.setStrPb_moneda(objL_rs.getString("MONEDA"));
                    	  objL_obraNotaCredito.setDblPb_importeDolares(objL_rs.getDouble("MONTO_DOLARES"));
                    	  objL_obraNotaCredito.setDblPb_saldoDolares(objL_rs.getDouble("SALDO_DOLARES"));
                        
                                
                                
                        }
                }else{
                    return null;
                }

                
        }catch (Exception e){
                e.printStackTrace();
                return null;
        }finally{
        		close(this.conn, objL_rs, stmt);
        }
        return( objL_obraNotaCredito);
		
		
	}

	private CallableStatement configuraParametrosNotaCreditocuenta(ObraNotaCredito notaCredito) 
		
		throws SQLException{
	     	
	    	stmt.registerOutParameter(1, OracleTypes.VARCHAR);               
	        stmt.registerOutParameter(2, OracleTypes.CURSOR);
	    	
	        stmt.setString(3, notaCredito.getStrPb_empresa());
	        stmt.setString(4, notaCredito.getStrPb_distribuidora());

	        
	        stmt.setString(5,"004");	       
	       stmt.setString(6,notaCredito.getStrPb_ser_doc());
	        stmt.setString(7,notaCredito.getStrPb_num_doc());
	        
	       
	        return(stmt);        
		
		
		
	}    
    
}
